﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Anata.Client
{
    public static class Synchronizer
    {
        /*
        public static void SynchTransaksiToTTVM(Transaksi original, TransaksiThumbnailViewModel ttvm)
        {
            ttvm.IdTransaksi = original.IdTransaksi;
            ttvm.IdKonsumen = original.IdKonsumen;
            ttvm.NamaKonsumen = original.Konsumen.Nama;
            ttvm.AlamatKonsumen = original.Konsumen.Alamat;
            ttvm.TeleponKonsumen = original.Konsumen.NoTelepon;
            ttvm.IdCabang = original.IdCabang;
            ttvm.WaktuBuat = original.WaktuBuat;
            ttvm.WaktuSelesai = original.WaktuSelesai;
            ttvm.KoreksiHarga = original.KoreksiHarga;
            ttvm.IsBatal = original.IsBatal;

            ttvm.TransaksiLayanans.Clear();
            TransaksiLayananThumbnailViewModel tempTLTVM = null;
            foreach (var tl in original.TransaksiLayanan)
            {
                tempTLTVM = new TransaksiLayananThumbnailViewModel();
                SynchTransaksiLayananToTLTVM(tl, tempTLTVM);
                ttvm.TransaksiLayanans.Add(tempTLTVM);
            }

            ttvm.TransaksiProduks.Clear();
            TransaksiProdukThumbnailViewModel tempTPTVM = null;
            foreach (var tp in original.TransaksiProduk)
            {
                tempTPTVM = new TransaksiProdukThumbnailViewModel();
                tempTPTVM.IdTransaksiProduk = tp.IdTransaksiProduk;
                tempTPTVM.IdTransaksi = tp.IdTransaksi;
                tempTPTVM.IdJenisStok = tp.IdJenisStok;
                tempTPTVM.NamaJenisStok = tp.JenisStok.Nama;
                tempTPTVM.IdKaryawan = tp.IdKaryawan;
                tempTPTVM.NamaKaryawan = tp.Karyawan.Nama;
                tempTPTVM.JumlahProduk = tp.JumlahProduk;
                tempTPTVM.HargaProduk = tp.HargaProduk;
                tempTPTVM.PotonganHarga = tp.PotonganHarga;
                ttvm.TransaksiProduks.Add(tempTPTVM);
            }

            ttvm.TransaksiPembayarans.Clear();
            TransaksiPembayaranThumbnailViewModel tempTBTVM = null;
            foreach (var tb in original.TransaksiPembayaran)
            {
                tempTBTVM = new TransaksiPembayaranThumbnailViewModel();
                tempTBTVM.IdTransaksiPembayaran = tb.IdTransaksiPembayaran;
                tempTBTVM.IdTransaksi = tb.IdTransaksi;
                tempTBTVM.IdJenisPembayaran = tb.IdJenisPembayaran;
                tempTBTVM.NamaJenisPembayaran = tb.JenisPembayaran.Nama;
                tempTBTVM.NominalPembayaran = tb.NominalPembayaran;
                ttvm.TransaksiPembayarans.Add(tempTBTVM);
            }
        }
        public static void SynchTransaksiLayananToTLTVM(TransaksiLayanan original, TransaksiLayananThumbnailViewModel tltvm)
        {
            tltvm.IdTransaksiLayanan = original.IdTransaksiLayanan;
            tltvm.IdTransaksi = original.IdTransaksi;
            tltvm.IdLayanan = original.IdLayanan;
            tltvm.NamaLayanan = original.Layanan.Nama;
            tltvm.HargaLayanan = original.HargaLayanan;
            tltvm.IdKaryawan = original.IdKaryawan;
            tltvm.NamaKaryawan = original.Karyawan.Nama;
            tltvm.NamaPromo = original.NamaPromo;
            tltvm.PotonganPromo = original.PotonganPromo;
            tltvm.NamaFreeGift = original.NamaFreeGift;
            tltvm.IdJenisStok = original.IdJenisStok;
            if (original.IdJenisStok.HasValue)
            {
                tltvm.NamaJenisStok = original.JenisStok.Nama;
            }
            tltvm.JumlahFreeGift = original.JumlahFreeGift;
            tltvm.NilaiKepuasan = original.NilaiKepuasan;
            tltvm.WaktuBuat = original.WaktuBuat;
            tltvm.WaktuTunggu = original.WaktuTunggu;
            tltvm.WaktuMulai = original.WaktuMulai;
            tltvm.WaktuSelesai = original.WaktuSelesai;
            tltvm.IsBatal = original.IsBatal;
        }
        public static void SynchTransaksiProdukToTLTVM(TransaksiProduk original, TransaksiProdukThumbnailViewModel tptvm)
        {
            tptvm.IdTransaksiProduk = original.IdTransaksiProduk;
            tptvm.IdTransaksi = original.IdTransaksi;
            tptvm.IdJenisStok = original.IdJenisStok;
            tptvm.NamaJenisStok = original.JenisStok.Nama;
            tptvm.IdKaryawan = original.IdKaryawan;
            tptvm.NamaKaryawan = original.Karyawan.Nama;
            tptvm.JumlahProduk = original.JumlahProduk;
            tptvm.HargaProduk = original.HargaProduk;
            tptvm.PotonganHarga = original.PotonganHarga;
        }
        public static void SynchTransaksiPembayaranToTBTVM(TransaksiPembayaran original, TransaksiPembayaranThumbnailViewModel )
        {
            tbtvm.IdTransaksiPembayaran = original.IdTransaksiPembayaran;
            tbtvm.IdTransaksi = original.IdTransaksi;
            tbtvm.IdJenisPembayaran = original.IdJenisPembayaran;
            tbtvm.NamaJenisPembayaran = original.JenisPembayaran.Nama;
            tbtvm.NominalPembayaran = original.NominalPembayaran;
        }
        public static void SynchTransaksiToTVM(Transaksi original, TransaksiViewModel tvm)
        {
            tvm.IdTransaksi.DataValue = original.IdTransaksi;
            tvm.IdKonsumen.DataValue = original.IdKonsumen;
            tvm.NamaKonsumen = original.Konsumen.Nama;
            tvm.AlamatKonsumen = original.Konsumen.Alamat;
            tvm.TeleponKonsumen = original.Konsumen.NoTelepon;
            tvm.IdCabang.DataValue = original.IdCabang;
            tvm.WaktuBuat.DataValue = original.WaktuBuat;
            tvm.WaktuSelesai.DataValue = original.WaktuSelesai;
            tvm.KoreksiHarga.DataValue = original.KoreksiHarga;
            tvm.IsBatal.DataValue = original.IsBatal;

            tvm.TransaksiLayanans.Clear();
            TransaksiLayananViewModel tempTLVM = null;
            foreach (var tl in original.TransaksiLayanan)
            {
                tempTLVM = tvm.ForceCreateChildTransaksiLayananVM();
                tempTLVM.IdTransaksiLayanan.DataValue = tl.IdTransaksiLayanan;
                tempTLVM.IdTransaksi.DataValue = tl.IdTransaksi;
                tempTLVM.IdLayanan.DataValue = tl.IdLayanan;
                tempTLVM.NamaLayanan = tl.Layanan.Nama;
                tempTLVM.HargaLayanan = tl.HargaLayanan;
                tempTLVM.IdKaryawan.DataValue = tl.IdKaryawan;
                tempTLVM.NamaKaryawan = tl.Karyawan.Nama;
                tempTLVM.NamaPromo.DataValue = tl.NamaPromo;
                tempTLVM.PotonganPromo.DataValue = tl.PotonganPromo;
                tempTLVM.NamaFreeGift.DataValue = tl.NamaFreeGift;
                tempTLVM.IdJenisStok.DataValue = tl.IdJenisStok;
                if (tl.IdJenisStok.HasValue)
                {
                    tempTLVM.NamaJenisStok = tl.JenisStok.Nama;
                }
                tempTLVM.JumlahFreeGift.DataValue = tl.JumlahFreeGift;
                tempTLVM.NilaiKepuasan.DataValue = tl.NilaiKepuasan;
                tempTLVM.WaktuBuat.DataValue = tl.WaktuBuat;
                tempTLVM.WaktuTunggu.DataValue = tl.WaktuTunggu;
                tempTLVM.WaktuMulai.DataValue = tl.WaktuMulai;
                tempTLVM.WaktuSelesai.DataValue = tl.WaktuSelesai;
                tempTLVM.IsBatal.DataValue = tl.IsBatal;
                tvm.TransaksiLayanans.Add(tempTLVM);
            }

            tvm.TransaksiProduks.Clear();
            TransaksiProdukViewModel tempTPVM = null;
            foreach (var tp in original.TransaksiProduk)
            {
                tempTPVM = tvm.ForceCreateChildTransaksiProdukVM();
                tempTPVM.IdTransaksiProduk.DataValue = tp.IdTransaksiProduk;
                tempTPVM.IdTransaksi.DataValue = tp.IdTransaksi;
                tempTPVM.IdJenisStok.DataValue = tp.IdJenisStok;
                tempTPVM.NamaJenisStok = tp.JenisStok.Nama;
                tempTPVM.IdKaryawan.DataValue = tp.IdKaryawan;
                tempTPVM.NamaKaryawan = tp.Karyawan.Nama;
                tempTPVM.JumlahProduk.DataValue = tp.JumlahProduk;
                tempTPVM.HargaProduk.DataValue = tp.HargaProduk;
                tempTPVM.PotonganHarga.DataValue = tp.PotonganHarga;
                tvm.TransaksiProduks.Add(tempTPVM);
            }

            tvm.TransaksiPembayarans.Clear();
            TransaksiPembayaranViewModel tempTBVM = null;
            foreach (var tb in original.TransaksiPembayaran)
            {
                tempTBVM = tvm.ForceCreateChildTransaksiPembayaranVM();
                tempTBVM.IdTransaksiPembayaran.DataValue = tb.IdTransaksiPembayaran;
                tempTBVM.IdTransaksi.DataValue = tb.IdTransaksi;
                tempTBVM.IdJenisPembayaran.DataValue = tb.IdJenisPembayaran;
                tempTBVM.NamaJenisPembayaran = tb.JenisPembayaran.Nama;
                tempTBVM.NominalPembayaran.DataValue = tb.NominalPembayaran;
                tvm.TransaksiPembayarans.Add(tempTBVM);
            }
        }
        public static void SynchTVMToTransaksi(TransaksiViewModel tvm, out Transaksi original, AnataEntities context)
        {
            original = null;
            List<int> originalTLs = new List<int>();
            List<int> originalTPs = new List<int>();
            List<int> originalTBs = new List<int>();
            if (tvm.IdTransaksi.DataValue != 0)
            {
                original = (from transaksi in context.Transaksi
                            where transaksi.IdTransaksi == tvm.IdTransaksi.DataValue
                            select transaksi).FirstOrDefault();
                foreach (var tl in original.TransaksiLayanan)
                {
                    originalTLs.Add(tl.IdTransaksiLayanan);
                }
                foreach (var tp in original.TransaksiProduk)
                {
                    originalTPs.Add(tp.IdTransaksiProduk);
                }
                foreach (var tb in original.TransaksiPembayaran)
                {
                    originalTBs.Add(tb.IdTransaksiPembayaran);
                }
            }
            else
            {
                original = context.Transaksi.CreateObject();
                context.Transaksi.AddObject(original);
                //TODO: Id Cabang & User
                original.IdCabang = Int32.Parse(ConfigurationManager.AppSettings["IdCabang"].ToString());
                original.WaktuBuat = DateTime.Now;
                //originalTransaksi.IdUser = SessionController.Instance.LoggedUserId;
                original.LastUpdated = DateTime.Now;
            }
            original.IdKonsumen = tvm.IdKonsumen.DataValue;
            original.WaktuSelesai = tvm.WaktuSelesai.DataValue;
            original.TotalHarga = tvm.TotalHarga;
            original.PotonganHarga = tvm.TotalPotongan;
            original.KoreksiHarga = tvm.KoreksiHarga.DataValue;
            original.IsBatal = tvm.IsBatal.DataValue;

            if (original.EntityState == EntityState.Modified)
            {
                //originalTransaksi.IdUser = SessionController.Instance.LoggedUserId;
                original.LastUpdated = DateTime.Now;
            }

            TransaksiLayanan originalTL = null;
            foreach (TransaksiLayananViewModel tlvm in tvm.TransaksiLayanans)
            {
                if (originalTLs.Remove(tlvm.IdTransaksiLayanan.DataValue))
                {
                    originalTL = original.TransaksiLayanan.First(
                        tl => tl.IdTransaksiLayanan == tlvm.IdTransaksiLayanan.DataValue);
                }
                else
                {
                    originalTL = context.TransaksiLayanan.CreateObject();
                    context.TransaksiLayanan.AddObject(originalTL);
                    original.TransaksiLayanan.Add(originalTL);
                    originalTL.WaktuBuat = DateTime.Now;
                    //originalTL.IdUser = SessionController.Instance.LoggedUserId;
                    originalTL.LastUpdated = DateTime.Now;
                }
                originalTL.IdLayanan = tlvm.IdLayanan.DataValue;
                originalTL.HargaLayanan = tlvm.HargaLayanan;
                originalTL.IdKaryawan = tlvm.IdKaryawan.DataValue;
                originalTL.NamaPromo = tlvm.NamaPromo.DataValue;
                originalTL.PotonganPromo = tlvm.PotonganPromo.DataValue;
                originalTL.NamaFreeGift = tlvm.NamaFreeGift.DataValue;
                originalTL.IdJenisStok = tlvm.IdJenisStok.DataValue;
                originalTL.JumlahFreeGift = tlvm.JumlahFreeGift.DataValue;
                originalTL.WaktuBuat = tlvm.WaktuBuat.DataValue;
                originalTL.WaktuTunggu = tlvm.WaktuTunggu.DataValue;
                originalTL.WaktuMulai = tlvm.WaktuMulai.DataValue;
                originalTL.WaktuSelesai = tlvm.WaktuSelesai.DataValue;
                originalTL.IsBatal = tlvm.IsBatal.DataValue;

                if (originalTL.EntityState == EntityState.Modified)
                {
                    //originalTL.IdUser = SessionController.Instance.LoggedUserId;
                    originalTL.LastUpdated = DateTime.Now;
                }
            }
            //clearing
            foreach (int removedId in originalTLs)
            {
                context.TransaksiLayanan.DeleteObject(
                    original.TransaksiLayanan.First(
                        tl => tl.IdTransaksiLayanan == removedId));
            }

            TransaksiProduk originalTP = null;
            foreach (TransaksiProdukViewModel tpvm in tvm.TransaksiProduks)
            {
                if (originalTPs.Remove(tpvm.IdTransaksiProduk.DataValue))
                {
                    originalTP = original.TransaksiProduk.First(
                        tp => tp.IdTransaksiProduk == tpvm.IdTransaksiProduk.DataValue);
                }
                else
                {
                    originalTP = context.TransaksiProduk.CreateObject();
                    context.TransaksiProduk.AddObject(originalTP);
                    original.TransaksiProduk.Add(originalTP);
                    //originalTP.IdUser = SessionController.Instance.LoggedUserId;
                    originalTP.LastUpdated = DateTime.Now;
                }
                originalTP.IdJenisStok = tpvm.IdJenisStok.DataValue;
                originalTP.IdKaryawan = tpvm.IdKaryawan.DataValue;
                originalTP.JumlahProduk = tpvm.JumlahProduk.DataValue;
                originalTP.HargaProduk = tpvm.HargaProduk.DataValue;
                originalTP.PotonganHarga = tpvm.PotonganHarga.DataValue;

                if (originalTP.EntityState == EntityState.Modified)
                {
                    //originalTP.IdUser = SessionController.Instance.LoggedUserId;
                    originalTP.LastUpdated = DateTime.Now;
                }
            }
            //clearing
            foreach (int removedId in originalTPs)
            {
                context.TransaksiProduk.DeleteObject(
                    original.TransaksiProduk.First(
                        tp => tp.IdTransaksiProduk == removedId));
            }

            TransaksiPembayaran originalTB = null;
            foreach (TransaksiPembayaranViewModel tbvm in tvm.TransaksiPembayarans)
            {
                if (originalTBs.Remove(tbvm.IdTransaksiPembayaran.DataValue))
                {
                    originalTB = original.TransaksiPembayaran.First(
                        tb => tb.IdTransaksiPembayaran == tbvm.IdTransaksiPembayaran.DataValue);
                }
                else
                {
                    originalTB = context.TransaksiPembayaran.CreateObject();
                    context.TransaksiPembayaran.AddObject(originalTB);
                    original.TransaksiPembayaran.Add(originalTB);
                    //originalTB.IdUser = SessionController.Instance.LoggedUserId;
                    originalTB.LastUpdated = DateTime.Now;
                }
                originalTB.IdJenisPembayaran = tbvm.IdJenisPembayaran.DataValue;
                originalTB.NominalPembayaran = tbvm.NominalPembayaran.DataValue;

                if (originalTB.EntityState == EntityState.Modified)
                {
                    //originalTB.IdUser = SessionController.Instance.LoggedUserId;
                    originalTB.LastUpdated = DateTime.Now;
                }
            }
            //clearing
            foreach (int removedId in originalTBs)
            {
                context.TransaksiPembayaran.DeleteObject(
                    original.TransaksiPembayaran.First(
                        tl => tl.IdTransaksiPembayaran == removedId));
            }
        }

        //dbmodel to vm

        //dbmodel to thumbnail vms
        public static void SynchKaryawanToKVM(Karyawan original, KaryawanViewModel kvm)
        {
            kvm.IdKaryawan.DataValue = original.IdKaryawan;
            kvm.Nama.DataValue = original.Nama;
            kvm.Alamat.DataValue = original.Alamat;
            kvm.NoTelepon.DataValue = original.NoTelepon;
            kvm.NoKTP.DataValue = original.NoKTP;
            kvm.JenisKelamin.DataValue = original.JenisKelamin;
            kvm.TanggalLahir.DataValue = original.TanggalLahir;
            kvm.Status.DataValue = original.Status;
            kvm.Agama.DataValue = original.Agama;
            kvm.GolDarah.DataValue = original.GolDarah;
            kvm.TanggalMasuk.DataValue = original.TanggalMasuk;
            kvm.TanggalKeluar.DataValue = original.TanggalKeluar;

            kvm.KaryawanLayanans.Clear();
            TransaksiLayananViewModel tempTLVM = null;
            foreach (var tl in original.TransaksiLayanan)
            {
                tempTLVM = kvm.ForceCreateChildTransaksiLayananVM();
                tempTLVM.IdTransaksiLayanan.DataValue = tl.IdTransaksiLayanan;
                tempTLVM.IdTransaksi.DataValue = tl.IdTransaksi;
                tempTLVM.IdLayanan.DataValue = tl.IdLayanan;
                tempTLVM.NamaLayanan = tl.Layanan.Nama;
                tempTLVM.HargaLayanan = tl.HargaLayanan;
                tempTLVM.IdKaryawan.DataValue = tl.IdKaryawan;
                tempTLVM.NamaKaryawan = tl.Karyawan.Nama;
                tempTLVM.NamaPromo.DataValue = tl.NamaPromo;
                tempTLVM.PotonganPromo.DataValue = tl.PotonganPromo;
                tempTLVM.NamaFreeGift.DataValue = tl.NamaFreeGift;
                tempTLVM.IdJenisStok.DataValue = tl.IdJenisStok;
                if (tl.IdJenisStok.HasValue)
                {
                    tempTLVM.NamaJenisStok = tl.JenisStok.Nama;
                }
                tempTLVM.JumlahFreeGift.DataValue = tl.JumlahFreeGift;
                tempTLVM.NilaiKepuasan.DataValue = tl.NilaiKepuasan;
                tempTLVM.WaktuBuat.DataValue = tl.WaktuBuat;
                tempTLVM.WaktuTunggu.DataValue = tl.WaktuTunggu;
                tempTLVM.WaktuMulai.DataValue = tl.WaktuMulai;
                tempTLVM.WaktuSelesai.DataValue = tl.WaktuSelesai;
                tempTLVM.IsBatal.DataValue = tl.IsBatal;
                tvm.TransaksiLayanans.Add(tempTLVM);
            }

            tvm.TransaksiProduks.Clear();
            TransaksiProdukViewModel tempTPVM = null;
            foreach (var tp in original.TransaksiProduk)
            {
                tempTPVM = tvm.ForceCreateChildTransaksiProdukVM();
                tempTPVM.IdTransaksiProduk.DataValue = tp.IdTransaksiProduk;
                tempTPVM.IdTransaksi.DataValue = tp.IdTransaksi;
                tempTPVM.IdJenisStok.DataValue = tp.IdJenisStok;
                tempTPVM.NamaJenisStok = tp.JenisStok.Nama;
                tempTPVM.IdKaryawan.DataValue = tp.IdKaryawan;
                tempTPVM.NamaKaryawan = tp.Karyawan.Nama;
                tempTPVM.JumlahProduk.DataValue = tp.JumlahProduk;
                tempTPVM.HargaProduk.DataValue = tp.HargaProduk;
                tempTPVM.PotonganHarga.DataValue = tp.PotonganHarga;
                tvm.TransaksiProduks.Add(tempTPVM);
            }

            tvm.TransaksiPembayarans.Clear();
            TransaksiPembayaranViewModel tempTBVM = null;
            foreach (var tb in original.TransaksiPembayaran)
            {
                tempTBVM = tvm.ForceCreateChildTransaksiPembayaranVM();
                tempTBVM.IdTransaksiPembayaran.DataValue = tb.IdTransaksiPembayaran;
                tempTBVM.IdTransaksi.DataValue = tb.IdTransaksi;
                tempTBVM.IdJenisPembayaran.DataValue = tb.IdJenisPembayaran;
                tempTBVM.NamaJenisPembayaran = tb.JenisPembayaran.Nama;
                tempTBVM.NominalPembayaran.DataValue = tb.NominalPembayaran;
                tvm.TransaksiPembayarans.Add(tempTBVM);
            }
        }

        public static void SynchKaryawanLayananToKLVM()

        public static void SynchKaryawanLayananToKLVM(KaryawanLayanan original, KaryawanLayananViewModel klvm) {

        //vm to dbmodel
        }
         * */
    }
}
